# 等号赋值只是创建一个新的变量，此变量会指向原对象，而并非创建一个新对象。
# 这两个变量实际上引用的是同一个对象，所以对其中一个变量进行修改，另一个变量也会受到影响。

# list1 = [1, 2, 3]
# list2 = list1
#
# list1.append(4)
#
# print(list1)  # 输出: [1, 2, 3, 4]
# print(list2)  # 输出: [1, 2, 3, 4]

# 浅拷贝会创建一个新对象，不过该对象的子对象仍然是原对象中子对象的引用。
# 新对象和原对象是不同的对象，但它们的某些内部元素是共享的。
# import copy
#
# list1 = [1, [2, 3]]
# list2 = copy.copy(list1)
#
# # 修改新列表的不可变元素
# list2[0] = 10
# print(list1)  # 输出: [1, [2, 3]]
# print(list2)  # 输出: [10, [2, 3]]
#
# # 修改新列表的可变元素
# list2[1].append(4)
# print(list1)  # 输出: [1, [2, 3, 4]]
# print(list2)  # 输出: [10, [2, 3, 4]]

# 深拷贝会创建一个全新的对象，并且递归地复制原对象的所有子对象，
# 新对象和原对象及其子对象完全独立，对新对象的任何修改都不会影响原对象。
import copy

list1 = [1, [2, 3]]
list2 = copy.deepcopy(list1)

# 修改新列表的不可变元素
list2[0] = 10
print(list1)  # 输出: [1, [2, 3]]
print(list2)  # 输出: [10, [2, 3]]

# 修改新列表的可变元素
list2[1].append(4)
print(list1)  # 输出: [1, [2, 3]]
print(list2)  # 输出: [10, [2, 3, 4]]


"""
不可变类型
int
float
bool
str
NoneType
tuple

可变类型
list
dict
set
"""

import copy

# d0 = {
# 	"id": 101,
# 	"name": "qiku",
# 	"address": {
# 		"id": 1,
# 		"name": "东三街"
# 	}
# }

# 等号赋值：完全等同于同一个
# d1 = d0
# print(id(d0), id(d1))
# print(id(d0["address"]), id(d1["address"]))
# d0["address"]["name"] = "黄河路"
# d0["id"] = 1001
# print(d1)


# 浅拷贝：不可变类型，拷贝值，可变类型拷贝地址    不分独立的两个对象
# d2 = copy.copy(d0)
# d2 = d0.copy()
# print(id(d0), id(d2))
# print(id(d0["address"]), id(d2["address"]))
# d0["id"] = 1001
# d0["address"]["name"] = "黄河路"
# print(d2)


# 深拷贝：不可变类型、可变类型 全部拷贝值    完全独立的两个对象
# d3 = copy.deepcopy(d0)
# print(id(d0), id(d3))
# print(id(d0["address"]), id(d3["address"]))
# d0["id"] = 1001
# d0["address"]["name"] = "黄河路"
# print(d3)


